import store from '../../../../store'
import { change3Dtiles } from 'assets/js/CesiumFun/CesiumPubFun/modelControl'
import { enableCamera } from 'assets/js/CesiumFun/CesiumPubFun/cameraControl'
// 添加雷达范围（四边形）
import addQuadrilateral from 'assets/js/CesiumFun/CesiumPubFun/addQuadrilateral'


// *** 移动模型
// *** 添加新模型的时候请在有3个*标记处添加对应判断
// *** 创建模型时第一个属性必须是"type": 类型名， 第二个必须是"Id": 模型自定义id

// 雷达范围相关 
var areaIndex;          // 当前模型在数组中的位置（vuex）
var updateFlag = false; // 是否刷新雷达的范围
var radarCartographic   // 当前的雷达位置（雷达范围中心点）


export default (viewer) => {
    var id;     // 记录当前移动的模型的id
    var handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);// 在handler中添加Cesium的点击事件

    // 左键拖动雷达
    // 鼠标按下时开始记录移动哪个雷达
    handler.setInputAction((movement) => {
        var pick = viewer.scene.pick(movement.position);            // pick为当前点击处的模型（存储单个模型属性）
        // 过滤未被Ceisum定义和不是3DTiles的模型
        if (!Cesium.defined(pick) || pick._batchId == undefined) {
            return
        }
        // ***添加新的模型类型（添加新的if（type==“移动的属性”）***
        if (pick.tileset.asset.extras[0].type != undefined) {
            // 雷达的模型
            if (pick.tileset.asset.extras[0].type == "radar") { 
                id = pick.tileset.asset.extras[0].Id;           // 记录当前移动的是哪个雷达（id）
                store.commit('changeRadarstate', true)          // 允许模型开始移动
            }
            // 摄像机模型
            else if (pick.tileset.asset.extras[0].type == "camera") { 
                id = pick.tileset.asset.extras[0].Id;
                store.commit('changeCamerastate', true)
            }
        }
        else { return }                                          // 返回未定义type的3Dtile
        // 禁用鼠标改变视角
        enableCamera(viewer, false);
    }, Cesium.ScreenSpaceEventType.LEFT_DOWN)

    // 鼠标移动时根据当前的雷达id移动雷达位置
    handler.setInputAction((movement) => {
        // ***在模型允许移动后记录鼠标位置（更改if处）***
        if (store.state.radar.moveRadar || store.state.camera.moveCamera) {
            // 模型碰撞检测
            var cartesian1 = viewer.scene.pickPosition(movement.endPosition);
            // 地形检测
            var cartesian2 = viewer.camera.pickEllipsoid(
                movement.endPosition,
                viewer.scene.globe.ellipsoid
            )
            // xyz坐标转换为经纬度
            var cartographic1 = Cesium.Cartographic.fromCartesian(cartesian1);
            var cartopraphic2 = Cesium.Cartographic.fromCartesian(cartesian2);
            // 判断鼠标所在地点是否有建筑/地面
            var cartographic = cartographic1.height > 0 ? cartographic1 : cartopraphic2// 经纬度坐标
            var cartesian = cartographic1.height > 0 ? cartesian1 : cartesian2
            // 弧度转换为经纬度
            var lat = Cesium.Math.toDegrees(cartographic.latitude);
            var lon = Cesium.Math.toDegrees(cartographic.longitude);
            // 更改雷达位置
            searchModel(id, lon, lat, cartographic.height, cartesian);
            radarCartographic = cartographic;
        }
    }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

    // 鼠标抬起时取消相机移动，并恢复鼠标拖动地图功能
    handler.setInputAction((movement) => {
        // ***左键抬起后禁用移动（更改if处）***
        if (store.state.radar.moveRadar || store.state.camera.moveCamera) {
            // ***鼠标抬起取消移动雷达（添加新的commit）***
            // 雷达
            store.commit('changeRadarstate', false);
               // 鼠标发生移动时创建新的雷达区域
            if(updateFlag) {
                var newArea = addQuadrilateral(viewer, radarCartographic, store.state.radar.radarCollection[areaIndex].asset.extras[1])
                store.commit('updateArea', {areaIndex, newArea})
            }
            
            // 摄像头
            store.commit('changeCamerastate', false);
            // 启用Cesium相机功能
            enableCamera(viewer, true);
            updateFlag = false; 
        }
    }, Cesium.ScreenSpaceEventType.LEFT_UP);
}

// 查找vuex存储的雷达
function searchModel(index, lon, lat, height, cartesian) {
    // ***在允许移动后添加新的if（开启新的移动）***
    if (store.state.radar.moveRadar) {
        areaIndex = startMove(store.state.radar.radarCollection, index, lon, lat, height, cartesian);
        updateFlag = true;
    }
    if (store.state.camera.moveCamera) {
        startMove(store.state.camera.cameraCollection, index, lon, lat, height, cartesian)
    }
}

// 找到需要移动的模型后更改位置属性并记录该位置
function startMove(model, index, lon, lat, height, cartesian) {
    for (let i = 0; i < model.length; i++) {
        if (model[i].asset.extras[0].Id == index) {
            change3Dtiles(model[i], lon, lat, height,
                model[i].asset.extras[0].rotation, model[i].asset.extras[0].scale);
            // 模型记录当前位置
            model[i].asset.extras[0].Position = cartesian;
            return i;
        }
    }
}